package TXPathFinder;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map.Entry;
import javax.media.j3d.Transform3D;
import javax.vecmath.Vector3f;

/**
*       \class	MoveAvatar
*	\brief	Gère le deplacement d'un entry
**/
public class MoveAvatar
{

    private static Transform3D trans = new Transform3D();
    private static int selectedAvatar = -1;
    private static int lastAvatar = 1;

    /**
    *	\brief	Constructeur
    **/
    public MoveAvatar()
    {
    }

   /**
    *	\brief	Update de la position des avatars : Itère sur chaque entry pour leur donner leurs nouvelles positions,
    *   puis met à jour la map cognitive de l'entry séléctioné, si il y'en à un
    **/
    public static void update()
    {
        Hashtable<Integer, Avatar> listAvatar = DataModel.getInstance().getListAvatar();
        Hashtable<Integer, Coordonnee> coordAgen = DataModel.getInstance().getPf().getAgents();

        int id;
        Avatar avatar;
        Coordonnee newPosition;

        // Mise à jour / Suppression
        for (Entry<Integer, Avatar> entry : listAvatar.entrySet()){
            id = entry.getKey();
            avatar = entry.getValue();

            // Si l'agent est encore la, on met à jour sa position
            if (coordAgen.containsKey(id)){
                newPosition = coordAgen.get(id);
                entry.getValue().setX(newPosition.getCoordX());
                entry.getValue().setY(ShapeService.getLargeur()-newPosition.getCoordY()-1);
                trans.setTranslation(new Vector3f(avatar.getX()+avatar.getRayon(),avatar.getY()-avatar.getRayon()+1,avatar.getRayon()));
                avatar.getTransform().setTransform(trans);
            }
            // Sinon, c'est qu'il s'est fait supprimer
            else{
                synchronized (DataModel.getInstance().getListAvatar()){
                    DataModel.getInstance().removeAvatar(id);
                }
            }
        }

        // Ajout
        for (Entry<Integer, Coordonnee> entry : coordAgen.entrySet())
        {
            // Si la table des avatar ne contient pas celui la, on l'ajoute
            if (!listAvatar.containsKey(entry.getKey())){
                DataModel.getInstance().addAvatar(entry.getValue());
            }
        }

        // Gestion de la carte de cognition
              /* if( lastAvatar >= 0 )
        {
            if( selectedAvatar < 0 )
            {
                DataModel.getInstance().getCurrentPath().resetPath();
                lastAvatar = -1;
            }
            else if( selectedAvatar >= 0 )
            {
                CognitionMap coordPathAndSight = DataModel.getInstance().getPf().GetCognitionMap(selectedAvatar);
                ArrayList<Coordonnee> coordPath = coordPathAndSight.getCoordPath();
                ArrayList<Coordonnee> coordSight = coordPathAndSight.getCoordSight();
                Coordonnee target = coordPathAndSight.getCoordTarget();
                ArrayList<Coordonnee> coordGhost = coordPathAndSight.getCoordGhost();

                //ajout du target goto
                String keyGoto = Integer.toString(target.getCoordX())+  ":" +Integer.toString(target.getCoordY());
                DataModel.getInstance().getCurrentPath().addTarget(keyGoto);

                //ajout du path
                int sizePath = coordPath.size();
                for(int j = 0 ; j < sizePath ; j++)
                {
                    int xx = coordPath.get(j).getCoordX();
                    int yy = coordPath.get(j).getCoordY();
                    String key = Integer.toString(xx)+  ":" +Integer.toString(yy);

                    DataModel.getInstance().getCurrentPath().addShapeToPath(key);
                }

                //ajout de la sight
                int sizeSight = coordSight.size();
                for(int j = 0 ; j < sizeSight ; j++)
                {
                    int xx = coordSight.get(j).getCoordX();
                    int yy = coordSight.get(j).getCoordY();
                    String key = Integer.toString(xx)+  ":" +Integer.toString(yy);
                    if( !DataModel.getInstance().getCurrentPath().isInCurrentSight(key) )
                    {
                        DataModel.getInstance().getCurrentPath().addShapeToSight(key);
                    }
                }

                //ajout des ghost
                DataModel.getInstance().deleteAllGhost();
                int sizeGhost = coordGhost.size();
                for(int j = 0 ; j < sizeGhost ; j++)
                {
                    int xx = coordGhost.get(j).getCoordX();
                    int yy = coordGhost.get(j).getCoordY();
                    DataModel.getInstance().getCurrentPath().addGhost(xx, yy);
                }
            }
        }*/
    }
}
